package entity;
import static entity.GameBoard.*;

import java.awt.Color;

import boundary.Adapter;
import desktop_fields.Street;

public class Fleet extends Ownable {

	private int rent1 = 500, rent2 = 1000, rent3 = 2000, rent4 = 4000;

	public Fleet(String title, String subtitle, String desc, int price, int cnsq){
		super(title,subtitle,desc,price,cnsq);
	}

	/**
	 * Udfører konsekvens af at lande på et felt.
	 * Hvis spilleren selv ejer feltet sker intet.
	 * Hvis feltet ikke har en ejer kan spilleren købe feltet (hvis han har råd).
	 * Hvis feltet er ejet af en anden spiller skal der betales afgift afhængig af hvor mange af felter af samme type spilleren ejer.
	 */
	public void landOnField(Spiller spiller) {
		// Beder adapteren vise feltbeskrivelsen
		Adapter.showFieldDesc(spiller);
		// Hvis feltet ejes af en spiller betales afgift/konsekvens
		if (owner != null && owner != spiller){
			owner.getKonto().updBalance(getRent());
			spiller.getKonto().updBalance(-getRent());
		}
		// Hvis der ikke er en ejer har spilleren mulighed for at købe feltet hvis han har råd til det
		else if (owner == null){
			if (spiller.getKonto().getBalance() >= price){
				boolean choice = Adapter.buyField();
				if (choice == true){
					owner = spiller;
					spiller.getKonto().updBalance(-price);
					Adapter.setOwner(owner.getPosition(), owner.getName());
					Adapter.setSubText(owner.getPosition(), Integer.toString(getRent()));
					spiller.setFleets(1); // information til spillerobjektet at han har købt et felt af typen fleet
					updFleets(spiller); // Opdaterer de felter af typen Fleet som spilleren ejer med ny konsekvens
				}
				else if (choice == false){// Der sker intet hvis spilleren ikke ønsker at købe det
				}
			}
			else  {
				Adapter.cannotAfford();
			}
		}
		else if (owner == spiller){
			Adapter.yourField();
		}		
	}

	/**
	 * Udregner konsekvensen for at lande på feltet som afhænger af hvor mange felter af typen Fleet feltets ejer ejer.
	 * @param antal Antal felter af typen Fleet som ejeren af dette felt ejer
	 * @return Konsekvensen for at lande på feltet
	 */
	public int getRent(){
		int antal = owner.getFleets();
		int output = 0;
		if (antal == 1){
			output = rent1;
		}
		else if(antal == 2){
			output = rent2;
		}	
		else if(antal == 3){
			output = rent3;
		}
		else if (antal == 4){
			output = rent4;
		}
		return output; 
	}
	

	/**
	 * Opdaterer alle spillerens felter af typen Fleets med ny konsekvens afhængig af hvor mange af disse felter han ejer.
	 * @param spiller Spilleren som har købt et Fleet felt
	 */
	public void updFleets(Spiller spiller){
		Fleet[] fleets = new Fleet[4];
		Ownable[] ownable = new Ownable[18];
		int q = 0; // Positionen af feltet på spillepladen (+1)
		int f = 0; 
		int s = 0;
		do {
			if (field[q] instanceof Ownable){
				ownable[f] = (Ownable) field[q];
				if (ownable[f] instanceof Fleet) {
					fleets[s] = (Fleet) ownable[f];
					if (fleets[s].getOwner() == this.owner){
						Adapter.setSubText(q+1, Integer.toString(getRent()));
					}
					s++;
				}
				f++;
			}
			q++;
		}
		while (q < field.length);
	}

	public desktop_fields.Field createGuiField() {
		Color fleetColor = new Color(0, 0, 255);

		desktop_fields.Field f = new Street.Builder()
		.setTitle(title)
		.setSubText(subtitle + price)
		.setDescription(description)
		.setFgColor(Color.BLACK)
		.setBgColor(fleetColor)
		.setRent("")
		.build();
		return f;
	}
}